<?php
namespace Admin\Model;//命名空间 防止重名
use Think\Model;//自动加载核心控制器类
class GoodsModel extends Model {
    // protected $patchValidate = true;  //批量验证
    public $cjl_data = array();  //定义公有属性，便于迁移。


    // 数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。
    // 数据验证有两种方式：
    // 1. 静态方式：在模型类里面通过$_validate属性定义验证规则。
    // 2. 动态方式：使用模型类的validate方法动态创建自动验证规则。
    // 无论是什么方式，验证规则的定义是统一的规则，定义格式为：
    // array(
    // array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    // array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    // ......
    // );
     
    protected $_validate = array(
        // array(验证字段1【对说明字段进行验证 对什么数据进行验证】,验证规则【符合说明规则 正则 函数名】,错误提示,[验证条件【字段符合什么条件的时候 就验证】,附加规则【补充验证规则】,验证时间【什么时候验证 新增的时候 修改的时候】]),
        //编辑的时候 验证时间为 空 3 全部验证 2 
        array('title','is_empty','请输入商品名称',1,'function'),
        array('market_price','is_money','请输入商品市场价',1,'function'),
        array('shop_price','is_money','请输入商品商城价',1,'function'),
        array('num','is_empty','请输入商品库存',1,'function'),
        array('resolution','is_empty','请输入商品分辨率',1,'function'),
        array('size','is_empty','请输入商品屏幕尺寸',1,'function'),
        array('cell','is_empty','请输入商品电池类型',1,'function'),
        array('img','is_empty','请输入商品封面',1,'function'),
        array('more_img','is_empty','请输入商品展示图',1,'function'),
        array('content','is_empty','请输入商品详情',1,'function'),
        //1 代表必须 用 function函数 is_empty  验证 验证的字段为：username，验证失败则报错：用户名格式错误   
        //function函数验证，定义的验证规则是一个函数名
        // array('url','is_empty','请输入商品url',1,'function'),
    );
 

    //自动完成通常用来完成默认字段写入，安全字段过滤以及业务逻辑的自动处理等，和自动验证的定义方式类似，自动完成的定义也支持静态定义和动态定义两种方式。
    ////1. 静态方式：在模型类里面通过$_auto属性定义处理规则。
    ///2. 动态方式：使用模型类的auto方法动态创建自动处理规则。
    
    protected $_auto = array(
        // array(完成字段1,完成规则,[完成条件【什么时间完成 添加1 修改2 任意时候3】,附加规则]),
        // array('url','norm_url',1,'function'),
        array('c_time','time',1,'function'),
        array('u_time','time',3,'function'), 
    );

    //自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法，使用create方法创建数据对象的时候会自动完成数据处理
    public function cjl_add(){
        $res = $this->create($this->cjl_data,1);//验证数据是否符合规则【自动验证】 符合规则后 加上自动完成，处理好数据  1代表添加
        // 验证成功 返回要插入数据库的字段 并且会把存入$this->data 里面
        // 验证失败 返回false 可以通过 $this->getError() 得到报错信息 还可以通过 $this->error

        if(!$res){
            return false;
        }
        //验证成功
        $res = $this->add();
        if($res){
            $dd = $this->cjl_data;
            $data['goods_id'] = $res;
            $data['more_img'] = $dd['more_img'];
            $data['content'] = $dd['content'];
            M('GoodsInfo')->data($data)->add();
        }
        $rr = $this->cjl_add_attr($res,1);//储存属性信息
        if(!$rr){
            return false;
        }
        return $res;//成功返回 ID  失败返回 false
    }

    public function cjl_save(){
        $res = $this->create($this->cjl_data,2);//2 代表的是 编辑的时候
        if(!$res){
            return false;            
        }
        //验证成功
        $res = $this->save();

        $dd = $this->cjl_data;
        $data['goods_id'] = $dd['id'];
        $data['more_img'] = $dd['more_img'];
        $data['content'] = $dd['content'];
        M('GoodsInfo')->data($data)->save();
        $rr = $this->cjl_add_attr($dd['id']);//储存属性信息
        if(!$rr){
            return false;
        }
        return $res;//成功返回 受影响行数 失败 返回false
    }

    //添加修改商品属性
    public function cjl_add_attr($res,$is_add=0){
        $data = $this->cjl_data;
        $pig = 0;
        // var_dump($data);exit;
        foreach ($data['spec_attr'] as $k => $v) {
            if(is_int($k)){
                // 排除备份的 nummmmmmmm 列表数据
                $v = array_values($v);//页面需要id下标作唯一标记 存入数据库 就不需要了 为了方便 前台获取商品信息
                $v = array_map('urlencode',$v);
                $da['attr_array'] = urldecode(json_encode($v));//urlencode urldecode 为了中文继续显示成中文
                
                $da['goods_id'] = $res;
                // var_dump($da);exit;

                
                $da['store_nums'] = (int)$data['store_nums'][$k];
                $da['market_price'] = (float)$data['market_prices'][$k];
                $da['shop_price'] = (float)$data['shop_prices'][$k];
                // var_dump($attr_array);

                if($da['market_price'] && $da['shop_price']){
                    if(!$dd[$da['attr_array']]){
                        $pig = 1;
                        // 不存在属性标记 说明之前的循环没出现过，那么储存一个标记
                        // 然后存入数据库
                        $dd[$da['attr_array']] = 1;
                        // var_dump($k);    
                        // var_dump($da);   
                        // var_dump($da); 
                        // exit;    
                        if($data['product_id'][$k]){
                            $da['id'] = $data['product_id'][$k];
                            M('Products')->data($da)->save();
                        }else{
                            unset($da['id']);
                            M('Products')->data($da)->add();
                        }                 
                    }
                }
            }
        }

        if(!$pig){
            // var_dump(444);exit;
            // 一条数据都没加
            $this->error = '请添加至少一条商品属性';
            if($is_add){
                $this->delete($res);
                M('GoodsInfo')->delete($res);
            }
            return false;
        }else{
            return true;

        }
    }

}